from typing import Optional

FULL_PROMPT = """# Context
- Plate-based data is rectangular and could be situated anywhere within the dataset.
- The first item in every row is the row index
{hint}

# Rules
- Ignore all data which is not part of the plate. 
- Row identifiers start with a single letter of the alphabet.
- The header row of the plate has monotonically increasing integers {col_range_str}.
- The header row should NOT be considered the starting row of the plate.

# Output
- Use 0-indexing for row and column numbers.
- Do NOT include the header row or header column in the output calcuation.
- Produce your output as JSON. ONLY RETURN THE JSON. The format should be:
```json
{json_format}
```
"""  # noqa: E50

NUM_PLATES_PROMPT = """- There {num_plates_str} in this data."""
ROWS_PROMPT = """- Each plate has {num_rows} rows."""
COLS_PROMPT = """- Each plate has {num_cols} columns."""
GENERIC_PLATES_PROMPT = """
- There may be multiple plates.
- Plate consist of 24 (4x6), 96 (8x12), 384 (16x24), or 1536 (32 x 48) wells.
"""

HUMAN_24W_PROMPT = "0,,,,,,,\n1,,1,2,3,4,5,6\n2,A,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006\n3,B,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006\n4,C,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006\n5,D,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006\n"  # noqa: E501
AI_24W_RESPONSE = '[{"row_start": 2, "row_end": 5, "col_start": 1, "col_end": 6, "contents": "SB_ID"}]'  # noqa: E501

HUMAN_96W_PROMPT = "0,,,,,,,,,,,,,\n1,,1,2,3,4,5,6,7,8,9,10,11,12\n2,A,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n3,B,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n4,C,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n5,D,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n6,E,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n7,F,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n8,G,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n9,H,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012\n"  # noqa: E501
AI_96W_RESPONSE = '[{"row_start": 2, "row_end": 9, "col_start": 1, "col_end": 12, "contents": "SB_ID"}]'  # noqa: E501

HUMAN_384W_PROMPT = "0,,,,,,,,,,,,,,,,,,,,,,,,,\n1,,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24\n2,A,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n3,B,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n4,C,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n5,D,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n6,E,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n7,F,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n8,G,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n9,H,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n10,I,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n11,J,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n12,K,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n13,L,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n14,M,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n15,N,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024\n"  # noqa: E501
# should be 15, 23
AI_384W_RESPONSE = '[{"row_start": 2, "row_end": 17, "col_start": 1, "col_end": 24, "contents": "SB_ID"}]'  # noqa: E501

HUMAN_1536W_PROMPT = "0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n1,,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48\n2,A,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n3,B,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n4,C,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n5,D,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n6,E,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n7,F,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n8,G,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n9,H,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n10,I,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n11,J,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n12,K,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n13,L,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n14,M,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n15,N,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n16,O,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n17,P,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n18,Q,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n19,R,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n20,S,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n21,T,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n22,U,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n23,V,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n24,W,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n25,X,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n26,Y,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n27,Z,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n28,AA,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n29,AB,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n30,AC,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n31,AD,SB-001,SB-002,SB-003,SB-004,SB-005,SB-006,SB-007,SB-008,SB-009,SB-010,SB-011,SB-012,SB-013,SB-014,SB-015,SB-016,SB-017,SB-018,SB-019,SB-020,SB-021,SB-022,SB-023,SB-024,SB-025,SB-026,SB-027,SB-028,SB-029,SB-030,SB-031,SB-032,SB-033,SB-034,SB-035,SB-036,SB-037,SB-038,SB-039,SB-040,SB-041,SB-042,SB-043,SB-044,SB-045,SB-046,SB-047,SB-048\n"  # noqa: E501
AI_1536W_RESPONSE = '[{"row_start": 2, "row_end": 33, "col_start": 1, "col_end": 48, "contents": "SB_ID"}]'  # noqa: E501

USER_EXAMPLE_DICT = {
    24: HUMAN_24W_PROMPT,
    96: HUMAN_96W_PROMPT,
    384: HUMAN_384W_PROMPT,
    1536: HUMAN_1536W_PROMPT,
}

AI_REPONSE_DICT = {
    24: AI_24W_RESPONSE,
    96: AI_96W_RESPONSE,
    384: AI_384W_RESPONSE,
    1536: AI_1536W_RESPONSE,
}


def create_prompt(
    num_plates: Optional[int] = None,
    num_rows: Optional[int] = None,
    num_cols: Optional[int] = None,
) -> str:
    additional_prompts = []
    if num_plates:
        num_plates_str = f"are {num_plates} plates" if num_plates > 1 else "is 1 plate"
        additional_prompts.append(
            NUM_PLATES_PROMPT.format(num_plates_str=num_plates_str)
        )
    if num_rows:
        additional_prompts.append(ROWS_PROMPT.format(num_rows=num_rows))
    if num_cols:
        additional_prompts.append(COLS_PROMPT.format(num_cols=num_cols))
    return (
        "\n".join(additional_prompts) if additional_prompts else GENERIC_PLATES_PROMPT
    )
